/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.tarifador.autenticacao;

/**
 *
 * @author henrique
 */
public class CriptografaSenha {

    // Constantes
    final int TRUE_VB = -1;
    final String CHAVE = "Gemco Creative Software";
    final int NUMERO_1 = 95;
    final int NUMERO_2 = 5;
    final int MAX_STRING = 255;
    char sKeyValue[] = CHAVE.toCharArray();

    private String Gemco1(String szIn, String szOut, int i) {
        if (i / 2 == 1500) {
            return Encrypt(szIn, szOut, true, 0);
        } else {
            return Encrypt("", szOut, false, -1);			// não faz nada
        }
    }

    private String Gemco2(String szIn, String szOut, int i) {
        if (i / 2 == 1500) {
            return Encrypt(szIn, szOut, false, 0);
        } else {
            return Encrypt("", szOut, true, -1);			// não faz nada
        }
    }

    @SuppressWarnings("unused")
	private String Gemco3(String szIn, String szOut, int i) {
        if (i % 1000 == 0) {
            return Encrypt(szIn, szOut, true, i / 1000);
        } else {
            return Encrypt("", szOut, false, -1);			// não faz nada
        }
    }

    @SuppressWarnings("unused")
	private String Encrypt(String szIn, String szOut, boolean bEncrypting, int iMetodo) {

        char[] szTexto, szResult = new char[MAX_STRING];

        int i, iPrev, iKeyIndex, iKeyLen, iTextoLen = 0;
        int iCarac, iNewCarac;
        int[] iKeyChar = new int[MAX_STRING];

        // verifica pré-requisitos
        if (szIn.length() >= MAX_STRING || szIn.length() == 0 || szOut.length() < szIn.length() + 1) {

            //--lstrcpy(szOut,"");
            szOut = "";

            return szOut;
        }
     
        szTexto = szIn.toCharArray();
        iTextoLen = szTexto.length;

        if (bEncrypting == false) {
            iMetodo = szTexto[iTextoLen - 1];
            szTexto[iTextoLen - 1] = 0;
            iTextoLen--;
            if (iMetodo < 1 || iMetodo > 4) {
                //--lstrcpy(szOut, "");			// método inválido
                szOut = "";
                return szOut;
            }
        }
       
        iPrev = NUMERO_1;
        iKeyIndex = 0;
        iKeyLen = sKeyValue.length; // lstrlen(sKeyValue);
        //--lstrcpy(szResult, "");
        //szResult = "".toCharArray();


        iKeyChar = new int[iKeyLen];

        // inicializa array
        for (i = 0; i < iKeyLen; i++) {
            iKeyChar[i] = sKeyValue[i];
        }


        // loop de encriptação
        for (i = 0; i < iTextoLen; i++) {
            iCarac = szTexto[i];
            iNewCarac = iCarac ^ iKeyChar[iKeyIndex] ^ iPrev ^ ((i / NUMERO_2) % 255);
            szResult[i] = (char) iNewCarac;
            if (!bEncrypting) {
                iPrev = iCarac;
            } else {
                iPrev = iNewCarac;
            }
            iKeyIndex++;
            if (iKeyIndex >= iKeyLen) {
                iKeyIndex = 0;
            }
        }
        szResult[i] = 0;
        if (bEncrypting) {
            //--if (lstrlen(szResult) == iTextoLen) {
            //--if (szResult.length == iTextoLen) {
            if (1 < 2) {
                szResult[i++] = 1;				// marca Método 1
                szResult[i] = 0;

                szOut = lstrcpy(szResult);

                return szOut;
            } else {
                if (iMetodo == 1) {
                    //--lstrcpy(szOut, "");
                    szOut = "";
                    return szOut;
                }
            }
        } else {

            //--lstrcpy(szOut, szResult);
            szOut = lstrcpy(szResult);
            return szOut;
        }

        return szOut;

    }
  
    public String criptografar(String senha) {
        return Gemco1(senha, senha + "  ", 3000);
    }

    public String descriptografar(String senha) {
        return Gemco2(senha, senha + "  ", 3000);
    }

    private String lstrcpy(char[] szResult) {

        String szOut = "";

        szOut = "";
        for (int i = 0; i < szResult.length; i++) {
            String c = String.valueOf(szResult[i]);
            if (szResult[i] == 0) {
                return szOut;
            }
            szOut += c;

        }
        return szOut;

    }
}
